/*     */ package com.zimbra.cs.account.ldap;
/*     */ 
/*     */ import com.zimbra.common.util.StringUtil;
/*     */ import java.util.HashMap;
/*     */ import java.util.HashSet;
/*     */ import java.util.Map;
/*     */ import java.util.Set;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public class LdapObjectClassHierarchy
/*     */ {
/*  33 */   private static Map<String, Set<String>> sSuperOCs = new HashMap();
/*     */   
/*     */   private static synchronized void addToSuperOCCache(Map<String, Set<String>> addition) {
/*  36 */     sSuperOCs.putAll(addition);
/*     */   }
/*     */   
/*     */   private static synchronized Set<String> getFromCache(String key) {
/*  40 */     return (Set)sSuperOCs.get(key);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private static boolean isSuperiorOC(String oc1, String oc2)
/*     */   {
/*  52 */     oc1 = oc1.toLowerCase();
/*  53 */     oc2 = oc2.toLowerCase();
/*     */     
/*  55 */     Set<String> supers = getFromCache(oc1);
/*     */     
/*  57 */     if (supers == null) {
/*  58 */       return false;
/*     */     }
/*     */     
/*  61 */     if (supers.contains(oc2)) {
/*  62 */       return true;
/*     */     }
/*     */     
/*  65 */     for (String superOC : supers) {
/*  66 */       if (isSuperiorOC(superOC, oc2)) {
/*  67 */         return true;
/*     */       }
/*     */     }
/*     */     
/*  71 */     return false;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private static void fetchAndCacheSuperiorOCsIfNecessary(LdapProv prov, String[] ocs)
/*     */   {
/*  81 */     Map<String, Set<String>> ocsToLookFor = new HashMap();
/*     */     
/*  83 */     for (String oc : ocs) {
/*  84 */       String ocLower = oc.toLowerCase();
/*     */       
/*  86 */       if (!ocLower.startsWith("zimbra"))
/*     */       {
/*     */ 
/*     */ 
/*     */ 
/*  91 */         if (getFromCache(ocLower) == null) {
/*  92 */           ocsToLookFor.put(ocLower, new HashSet());
/*     */         }
/*     */       }
/*     */     }
/*     */     
/*  97 */     if (ocsToLookFor.size() > 0) {
/*  98 */       prov.searchOCsForSuperClasses(ocsToLookFor);
/*  99 */       addToSuperOCCache(ocsToLookFor);
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public static String getMostSpecificOC(LdapProv prov, String[] oc1s, String oc2)
/*     */   {
/* 111 */     fetchAndCacheSuperiorOCsIfNecessary(prov, oc1s);
/*     */     
/*     */ 
/*     */ 
/*     */ 
/* 116 */     String mostSpecific = oc2;
/* 117 */     for (String oc : oc1s) {
/* 118 */       if (isSuperiorOC(oc, mostSpecific)) {
/* 119 */         mostSpecific = oc;
/*     */       }
/*     */     }
/*     */     
/* 123 */     return mostSpecific;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public static boolean isSuperiorOC(LdapProv prov, String oc1, String oc2)
/*     */   {
/* 142 */     fetchAndCacheSuperiorOCsIfNecessary(prov, StringUtil.toStringArray(oc1));
/* 143 */     return isSuperiorOC(oc1, oc2);
/*     */   }
/*     */ }


/* Location:              /home/mint/zimbrastore.jar!/com/zimbra/cs/account/ldap/LdapObjectClassHierarchy.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */